#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "AD.h"
#include "Thermistor.h"
#include <math.h>
#include "Serial.h"
#include "Buzzer.h"

// 打印出温度传感器的提示信息
void makerobo_Print(int x)
{
OLED_Clear(); // 清除OLED显示
switch(x)
{
case 1: // 温度大于28
OLED_ShowString(2,1,"Temp High!");
OLED_ShowNum(2,10,1,1); // 显示数字1
Buzzer_ON(); // 蜂鸣器响
GPIO_Write(GPIOA,0x0002);
break;
case 2: // 温度在24到28之间
OLED_ShowString(2,1,"Temp OK!");
OLED_ShowNum(2,10,2,1); // 显示数字2
Buzzer_OFF(); // 蜂鸣器不响
GPIO_Write(GPIOA,0x0008);
break;
case 3: // 温度小于24
OLED_ShowString(2,1,"Temp Low!");
OLED_ShowNum(2,10,3,1); // 显示数字3
Buzzer_OFF(); // 蜂鸣器不响
GPIO_Write(GPIOA,0x0010);
break;
default: // 打印错误信息
OLED_ShowString(2,1,"Error!");
break;
}
}

int main(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
// 相关变量定义
uint16_t T_analogVal;
double T_Vr, T_Rt, T_temp;
int T_status = -1; // 初始化状态为-1，确保第一次循环时能正确判断状态变化

OLED_Init();
AD_Init();
Thermistor_Init();
Serial_Init();
Buzzer_Init(); // 假设有一个蜂鸣器初始化函数

OLED_ShowString(1,1,"T_temp:");
OLED_ShowString(1,14,"C");

while(1)
{
    T_analogVal = AD_GetValue();
    
    T_Vr = 3.3 * (double)(T_analogVal) / 4095;
    T_Rt = 10000 * (double)(T_Vr) / (3.3 - (double)(T_Vr));
    T_temp = 1 / (((log(T_Rt/10000)) / 3950)+(1 / (273.15 + 25)));
    T_temp = T_temp - 273.15;
    
    printf("Current temperature : %lf\r\n", T_temp);
    
    // 根据温度设置状态
    int T_tmp = (T_temp > 28) ? 1 : ((T_temp < 24) ? 3 : 2);
    
    if(T_tmp != T_status) // 判断状态值发生改变
    {
        makerobo_Print(T_tmp); // 打印出温度传感器的提示信息
        T_status = T_tmp; // 把当前状态值设置为比较状态值，避免重复打印
    }
    
    Delay_ms(1000);
}
}